# coding=utf-8
"""
Author: Mr.夏末
@Function: 解析Excel结果
"""
from common.Excel import Reader
from common.Logger import path, logger


class Results:
    def __init__(self, filepath):
        # 汇总信息
        self.summary = {}
        # 分组信息
        self.group = []
        # 初始化读取
        self.reader = Reader()
        self.reader.open_excel(path + 'lib/cases/' + filepath)
        self.summary['title'] = filepath

    def get_summary(self):
        """获取结果文件汇总信息"""
        # 遍历
        sheets = self.reader.get_sheets()

        # 先把开始和结束时间读出来
        self.reader.set_sheet(sheets[0])
        lines = self.reader.readline()
        line = lines[1]

        self.summary['starttime'] = line[1]
        self.summary['endtime'] = line[2]

        # 初始化
        count = 0
        pass_count = 0

        for sheet in sheets:
            self.reader.set_sheet(sheet)
            lines = self.reader.readline()
            for line in lines:
                # 如果第一列或者第二列有内容就不统计
                if len(line[0]) > 0 or len(line[1]) > 0:
                    pass
                else:
                    count += 1
                    if len(line) > 8 and line[7].upper() == "PASS":
                        pass_count += 1

        self.summary['casecount'] = count

        if count > 0:
            if count == pass_count:
                self.summary['status'] = 'PASS'
            else:
                self.summary['status'] = 'FAIL'
            passrate = round(pass_count * 100 / count, 2)
            passrate = str(passrate) + '%'
        else:
            passrate = "0%"
            self.summary['status'] = 'N/A'

        self.summary['passrate'] = passrate
        logger.info(self.summary)
        return self.summary

    def get_groups(self):
        # 用于记录执行结果，逻辑为，只要分组中出现一个失败用例，则认为该分组执行失败，与flag联合使用。
        self.group.clear()
        # 每一个用例组统计信息为列表
        groupinfo = []

        # 统计每一个分组的用例总条数
        totalcount = 0
        # 统计分组用例中通过用例的条数数
        totalpass = 0

        # 获取所有sheet页面
        for n in self.reader.get_sheets():
            # logger.info(n)
            # 从第一个页面开始解析
            self.reader.set_sheet(n)

            # 遍历sheet里面所有用例
            lines = self.reader.readline()

            for i in range(1, len(lines)):
                # 查找记录了分组信息的行
                # 如果第一列（分组信息）
                line = lines[i]
                # 如果第一列信息不为零，那么这是一个新的分组的开始
                if not line[0] == '':
                    # 先保存上一步信息
                    # 只要不为空，就保存
                    if totalcount > 0:
                        if totalcount == totalpass:
                            status = 'PASS'
                        else:
                            status = 'FAIL'
                        groupinfo.append(totalcount)
                        groupinfo.append(totalpass)
                        groupinfo.append(status)
                        self.group.append(groupinfo)

                        # 重置下一个分组的统计信息
                        # 每一个分组统计信息为列表
                        groupinfo = []
                        # 统计每一个分组的用例总条数
                        totalcount = 0
                        # 统计分组用例中通过用例的条数数
                        totalpass = 0

                    # 保存分组名字
                    groupinfo.append(line[0])

                # 第二列（类别或用例名）不同时为空,则不是用例，执行非用例的操作
                elif not line[1] == '':
                    # 不做统计
                    pass

                # 非用例行判断结束
                # 第一列信息和第二列信息均为空的行，即用例行，这时开始进行用例数、通过数、状态的统计。
                else:
                    totalcount += 1
                    if len(line) > 8 and line[7].upper() == "PASS":
                        totalpass += 1

            # 当一个sheet统计完成后，保存最后一个分组统计的结果
            if totalcount == totalpass:
                status = 'PASS'
            else:
                status = 'FAIL'

            if len(groupinfo) == 0:
                groupinfo.append('用例数据错误')
            groupinfo.append(totalcount)
            groupinfo.append(totalpass)
            groupinfo.append(status)
            self.group.append(groupinfo)
            # 重置下一个分组的统计信息
            # 每一个分组统计信息为列表
            groupinfo = []

            # 统计每一个分组的用例总条数
            totalcount = 0
            # 统计分组用例中通过用例的条数数
            totalpass = 0
        logger.info(self.group)
        return self.group


if __name__ == '__main__':
    res = Results('result-电商项目用例.xlsx')
    res.get_summary()
    print(res.get_summary())
    res.summary['runtype'] = "Web"

    res.get_groups()
    print(res.group)
